package 反射;

class Student {
    //私有属性 name
    private String name="bit";
    //共有属性 age
    public int age=18;

    //不带参数的公有构造方法
    public Student() {
        System.out.println("Student()");
    }

    //带参数的私有构造方法
    private Student(String name,int age) {
        this.name=name;
        this.age=age;
        System.out.println("Student(name,age)");
    }

    private void eat() {
        System.out.println("eat");
    }

    private void function(String str) {
        System.out.println(str);
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}


public class TestDemo {


    // Class对象只有1个
    public static void main(String[] args) {
        //获取 Class对象的三种方式
        /*
        1.通过 getClass() 获取Class对象
         */
        Student s1=new Student();
        Class c1=s1.getClass();

        /*
        2.通过 类名.class 获取Class对象
          该方法最为安全可靠，程序性能更高 这说明任何一个类都有一个隐含的静态成员变量 class
         */
        Class c2=Student.class;

        /*
        3.通过 Class 对象的 forName()静态方法 获取Class对象
          使用最多！！！ 但可能抛出 ClassNotFoundException 异常
         */
        try {
            Class c3 = Class.forName("反射.Student");
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        System.out.println(c1.equals(c2));//true  所以 Class对象只有1个

        System.out.println(c2.equals(c1));



    }
}
